package v1

import (
    "github.com/runningwater/gohub/app/models/{{PackageName}}"
    "github.com/runningwater/gohub/app/policies"
    "github.com/runningwater/gohub/app/requests"
    "github.com/runningwater/gohub/pkg/response"

    "github.com/gin-gonic/gin"
)

type {{StructNamePlural}}Controller struct {
    BaseApiController
}

func (ctrl *{{StructNamePlural}}Controller) Index(c *gin.Context) {
    {{VariableNamePlural}} := {{PackageName}}.All()
    response.Data(c, {{VariableNamePlural}})
}

func (ctrl *{{StructNamePlural}}Controller) Show(c *gin.Context) {
    {{VariableName}}Model := {{PackageName}}.Get(c.Param("id"))
    if {{VariableName}}Model.ID == 0 {
        response.Abort404(c)
        return
    }
    response.Data(c, {{VariableName}}Model)
}

func (ctrl *{{StructNamePlural}}Controller) Store(c *gin.Context) {

    request := requests.{{StructName}}Request{}
    if ok := requests.Validate(c, &request, requests.{{StructName}}Save); !ok {
        return
    }

    {{VariableName}}Model := {{PackageName}}.{{StructName}}{
        FieldName:      request.FieldName,
    }
    {{VariableName}}Model.Create()
    if {{VariableName}}Model.ID > 0 {
        response.Created(c, {{VariableName}}Model)
    } else {
        response.Abort500(c, "创建失败，请稍后尝试~")
    }
}

func (ctrl *{{StructNamePlural}}Controller) Update(c *gin.Context) {

    {{VariableName}}Model := {{PackageName}}.Get(c.Param("id"))
    if {{VariableName}}Model.ID == 0 {
        response.Abort404(c)
        return
    }

    if ok := policies.CanModify{{StructName}}(c, {{VariableName}}Model); !ok {
        response.Abort403(c)
        return
    }

    request := requests.{{StructName}}Request{}
    bindOk, errs := requests.Validate(c, &request, requests.{{StructName}}Save)
    if !bindOk {
        return
    }
    if len(errs) > 0 {
        response.ValidationError(c, errs)
        return
    }

    {{VariableName}}Model.FieldName = request.FieldName
    rowsAffected := {{VariableName}}Model.Save()
    if rowsAffected > 0 {
        response.Data(c, {{VariableName}}Model)
    } else {
        response.Abort500(c, "更新失败，请稍后尝试~")
    }
}

func (ctrl *{{StructNamePlural}}Controller) Delete(c *gin.Context) {

    {{VariableName}}Model := {{PackageName}}.Get(c.Param("id"))
    if {{VariableName}}Model.ID == 0 {
        response.Abort404(c)
        return
    }

    if ok := policies.CanModify{{StructName}}(c, {{VariableName}}Model); !ok {
        response.Abort403(c)
        return
    }

    rowsAffected := {{VariableName}}Model.Delete()
    if rowsAffected > 0 {
        response.Success(c)
        return
    }

    response.Abort500(c, "删除失败，请稍后尝试~")
}
